Client/server software applications have come under growing pressure to change in order to meet evolving requirements and alterations within the environments in which they are deployed. It is desirable that these applications exhibit maximum performance under stressful and even unforeseen circumstances. Simply trying, at design time, to predict what adaptation may be required at run time (e.g., a Just in Case (JIC) approach), is often not enough since this cannot anticipate all run-time situations that actually require adaptation at run time.
Furthermore, attempting to build adaptability into an application before it is deployed requires unusual clairvoyance on the part of software developers, since the developers need to understand what parts of the application will have to be adapted and to what degree during the design phase. Even the most well-thought and anticipated design will often require some degree of specific tailoring to fit circumstances once the impact upon the application becomes known for those circumstances.
One adaptability concern relates to an application's scalability or performance. That is, an application's usage or commercial success may initially be underestimated. Consequently, the application may need to be scaled upward to meet the unexpected demand. A popular approach to this problem is to over-provision computing resources (e.g., processors and/or memory), typically by supplying duplicate machines that share application requests through some load balancer mechanism. This solution is not only costly, but also requires increased configuration and administration.
Another approach to application scalability is to deploy caching services. With caching services frequently accessed application data is maintained in memory for improved access response times. This approach requires maintenance and support of caching policies and requires maintaining additional hardware associated with memory devices that support caching.
In general, application adaptability has been primarily concerned with techniques that attempt to stretch limited resources (e.g., processor and memory) farther than they would otherwise have extended when a particular application or component becomes popular beyond initial expectations. These approaches have not focused on altering the behavior of the application, but have rather sought to improve the environment and external interfaces associated with the application.
Therefore, there is a need for improved application or software component adaptability techniques, which dynamically extend or alter a component's behavior for purposes of acquiring a desired adaptation.